사이트 내 전체검색
PHP
sockopen()함수를 이용해서 막혀있는 이미지 가져오기
로빈아빠
https://cmd.kr/php/809 URL이 복사되었습니다.

본문

네이버같은경우 타서버에서 네이버이미지를 링크해보면 엑박이 뜨는게 있다. 이건 자기네 서버가 아닌 다른서버에서 자기네 이미지를 긁어가는걸 방지할려고 하는건데.. 트래픽방지겠지...

그런데 fopen()함수로 열어서 가지고 오면 어떻게 될거 같은데 안타깝게도 거의 웹호스팅회사들은 해킹방지를 위해서 fopen()함수를 열어놓고있지않다.

하지만 fsockopen()함수는 거의 호스팅회사에서 허용을 해놓은걸 볼수 있기때문에 이 fsockopen()함수를 이용해서 막혀있는 이미지를 긁어올수 있다.

$host = '호스팅주소';   //네이버 같은경우 'www.naver.com'
$service_uri = '/이미지경로및 이미지이름';  //    ex) '/abc/abc.jpg'
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
    fputs ($fp, "GET $service_uri HTTP/1.0\r\n\r\n");
    while (!feof($fp)) {
        $img_source .= fgets($fp, 128);
    }
    fclose ($fp);
}

그럼 $img_source에 이미지의 내용이 모두 저장된다.
그런데 echo $img_source해서 보면 알겠지만     fsockopen()함수는 그 파일의 헤더정보까지 모두 읽어봐서 뿌려버린다. $img_source에서 헤더 정보를 버린채 알갱이만 뽑아와야 나중에 이미지를 볼수 있다.

$img_split   = explode("\r\n\r\n", $html_source);
'\r\n\r\n'이게 헤더와 알갱이를 구분해주는 구문이다. 헤더와 알갱이는 두칸이 띄워져 있다.

이렇게 하면 $img_split[1]에 이미지의 진짜 내용이 들어가게 된다.

이렇게 한다음 header정보에 이미지 파일이라는 정보를 넣어서
header('Content-Type: image/jpeg;\r\n');
뿌려주면 되겠다.


모두를 정리하면
<?php
header('Content-Type: image/jpeg;\r\n');

$host = '호스팅주소이름';
$service_uri = '/경로및 파일이름';
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
    fputs ($fp, "GET $service_uri HTTP/1.0\r\n\r\n");
    while (!feof($fp)) {
        $img_source .= fgets($fp, 128);
    }
    fclose ($fp);

$img_split   = explode("\r\n\r\n", $img_source);

echo $img_split[1];
?>
이걸 응용해서 파일이름을 get으로 넘겨 받아 이미지파일로 이용하면 될듯

댓글목록

하헛하님의 댓글

profile_image 하헛하 작성일

좋은내용이네요

PHP
871 (4/18P)

Search

Copyright © Cmd 명령어 3.145.167.176